package view.lager;

import databasehandling.HandlerFactory;
import databasehandling.VareHandler;
import java.awt.Dimension;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Vare;
import model.VareGruppe;
import view.MainGUI;

public class LagerPanel extends javax.swing.JPanel {

    private final VareHandler vareHandler;
    private boolean settingVaregruppeCombo;
    private boolean startingUp;
    private MainGUI mainGUI;

    private final static boolean DEBUGMODE = false;

    /**
     * Bruges til at fremvise Lager-objekter i en dynamisk liste af
     * LagerVareListePaneler
     *
     * @param mainGUI Et objekt af mainGUI-klassen som skal gøre det muligt at
     * skifte vindue i forhold til det cardlayout der bliver brugt i programmet.
     */
    public LagerPanel(MainGUI mainGUI) {
        initComponents();
        vareHandler = HandlerFactory.getInstance().getVareHandler();
        setSize(779, 549);
        settingVaregruppeCombo = false;
        startingUp = true;
        lagerListePanel.setBounds(0, 0, 560, 480);
        
    }

    public void updateLagerPanel() {
        //<editor-fold defaultstate="collapsed" desc="Indlæsning af varegrupper">
        if (startingUp) {
            settingVaregruppeCombo = true;
            try {
                ArrayList<VareGruppe> vareGruppeList = vareHandler.getAlleVaregrupper();
                varegruppeCombo.removeAllItems();
                varegruppeCombo.addItem(new VareGruppe(0, "Alle"));
                for (VareGruppe vareGruppe : vareGruppeList) {
                    varegruppeCombo.addItem(vareGruppe);
                }
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(this, "Fejl 1003 \nFejl ved indlæsning af varegrupper fra databasen. Prøv venligst igen senere. \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
            }
            if (varegruppeCombo.getItemAt(0) != null) {
                varegruppeCombo.setSelectedIndex(0);
            }
            startingUp = false;
        }
        settingVaregruppeCombo = false;
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="Indhentning af varer">
        lagerListePanel.removeAll();
        ArrayList<Vare> vareList;
        ArrayList<LagerVareListePanel> varePanelList = new ArrayList<>();

        try {
            int varegruppeID = 0;
            if (varegruppeCombo.getSelectedItem() != null) {
                VareGruppe vareGruppe = (VareGruppe) varegruppeCombo.getSelectedItem();
                varegruppeID = vareGruppe.getId();
            }
            if (DEBUGMODE) {
                System.out.println("Valgte varegruppe:" + varegruppeID);
            }
            vareList = vareHandler.getVareVedVaregruppeNR(varegruppeID);
            for (int i = 0; i < vareList.size(); i++) {
                LagerVareListePanel varePanel = new LagerVareListePanel(mainGUI, vareList.get(i));
                varePanelList.add(varePanel);
            }
            if (varePanelList.isEmpty()) {
                lagerListePanel.removeAll();
                lagerListePanel.repaint();
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1004 \nFejl ved indlæsning af varer fra databasen. Prøv venligst igen senere. \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        }
        if (DEBUGMODE) {
            System.out.println("Antal fundne varer på valgte varegruppe: " + varePanelList.size());
        }
        tilføjPaneler(varePanelList);
//</editor-fold>   
    }

    private void søgVareFraSøgefelt() {
        ArrayList<Vare> vareList = new ArrayList<>();
        int antal = 0;
        try {
            vareList = vareHandler.getVarerUdfraSøgning(søgVareTxt.getText());
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(this, "Fejl 1005 \nFejl ved indlæsning af lager fra databasen. Prøv venligst igen senere. \n" + ex.getLocalizedMessage(), "Database Timeout", 0);
        }
        ArrayList<LagerVareListePanel> fundneVarerPanelList = new ArrayList<>();
        for (int i = 0; i < vareList.size(); i++) {
            antal = antal + vareList.get(i).getAntal();
            LagerVareListePanel vareListePanel = new LagerVareListePanel(mainGUI, vareList.get(i));
            fundneVarerPanelList.add(vareListePanel);
        }
        if (DEBUGMODE) {
            System.out.println("Fundne varer: " + fundneVarerPanelList.size());
        }
        tilføjPaneler(fundneVarerPanelList);
        if (DEBUGMODE) {
            System.out.println("Varen skulle meget gerne blive vist");
        }
    }

    private void tilføjPaneler(ArrayList<LagerVareListePanel> lagerListe) {
        int antal = 0;
        int dy = 0;
        lagerListePanel.removeAll();

        for (int i = 0; i < lagerListe.size(); i++) {
            antal = antal + lagerListe.get(i).getLager().getAntal();
            lagerListePanel.add(lagerListe.get(i));
            lagerListe.get(i).setBounds(-3, dy, 632, 34);
            lagerListe.get(i).setVisible(true);
            dy = dy + lagerListe.get(i).getHeight();
        }
        lagerListePanel.setPreferredSize(new Dimension(lagerListePanel.getWidth(), dy));
        lagerListePanel.repaint();
        TotalAntalPåLagerTxt.setText(antal + "");
        revalidate();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        varegruppeLabel = new javax.swing.JLabel();
        søgVareLabel = new javax.swing.JLabel();
        varegruppeCombo = new javax.swing.JComboBox();
        søgVareTxt = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        lagerListePanel = new javax.swing.JPanel();
        TotalAntalLabel = new javax.swing.JLabel();
        TotalAntalPåLagerTxt = new javax.swing.JTextField();
        jPanel1 = new javax.swing.JPanel();
        jSeparator2 = new javax.swing.JSeparator();
        jSeparator3 = new javax.swing.JSeparator();
        jSeparator4 = new javax.swing.JSeparator();
        jSeparator5 = new javax.swing.JSeparator();
        jSeparator6 = new javax.swing.JSeparator();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        jSeparator7 = new javax.swing.JSeparator();
        jSeparator8 = new javax.swing.JSeparator();
        jLabel7 = new javax.swing.JLabel();

        setOpaque(false);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                formComponentShown(evt);
            }
        });
        setLayout(null);

        varegruppeLabel.setText("Vælg varegruppe:");
        add(varegruppeLabel);
        varegruppeLabel.setBounds(590, 14, 160, 20);

        søgVareLabel.setText("Søg vare:");
        add(søgVareLabel);
        søgVareLabel.setBounds(590, 80, 60, 14);

        varegruppeCombo.setBackground(MainGUI.BUTTON_STANDARD_COLOR);
        varegruppeCombo.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                varegruppeComboItemStateChanged(evt);
            }
        });
        add(varegruppeCombo);
        varegruppeCombo.setBounds(590, 40, 166, 30);

        søgVareTxt.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                søgVareTxtFocusGained(evt);
            }
        });
        søgVareTxt.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                søgVareTxtKeyReleased(evt);
            }
        });
        add(søgVareTxt);
        søgVareTxt.setBounds(590, 100, 166, 30);

        jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane2.setOpaque(false);

        lagerListePanel.setBackground(new java.awt.Color(255, 255, 255));
        lagerListePanel.setLayout(null);
        jScrollPane2.setViewportView(lagerListePanel);

        add(jScrollPane2);
        jScrollPane2.setBounds(10, 40, 560, 559);

        TotalAntalLabel.setText("Total antal på lager:");
        add(TotalAntalLabel);
        TotalAntalLabel.setBounds(580, 550, 116, 14);

        TotalAntalPåLagerTxt.setEditable(false);
        add(TotalAntalPåLagerTxt);
        TotalAntalPåLagerTxt.setBounds(700, 550, 56, 25);

        jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jPanel1.setOpaque(false);
        jPanel1.setLayout(null);

        jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator2);
        jSeparator2.setBounds(80, 0, 10, 32);

        jSeparator3.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator3);
        jSeparator3.setBounds(450, 0, 10, 32);

        jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator4);
        jSeparator4.setBounds(140, 0, 10, 32);

        jSeparator5.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator5);
        jSeparator5.setBounds(310, 0, 10, 32);

        jSeparator6.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator6);
        jSeparator6.setBounds(510, 0, 10, 32);

        jLabel1.setText("Varegruppe");
        jPanel1.add(jLabel1);
        jLabel1.setBounds(10, 10, 80, 14);

        jLabel2.setText("VareNr");
        jPanel1.add(jLabel2);
        jLabel2.setBounds(90, 10, 70, 14);

        jLabel3.setText("Varenavn");
        jPanel1.add(jLabel3);
        jLabel3.setBounds(150, 10, 160, 14);

        jLabel4.setText("Indkøbspris");
        jPanel1.add(jLabel4);
        jLabel4.setBounds(320, 10, 60, 14);

        jLabel5.setText("Pris i DKK");
        jPanel1.add(jLabel5);
        jLabel5.setBounds(390, 10, 60, 14);

        jLabel6.setText("Antal");
        jPanel1.add(jLabel6);
        jLabel6.setBounds(520, 10, 40, 14);

        jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator1);
        jSeparator1.setBounds(559, 0, 10, 32);

        jSeparator7.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator7);
        jSeparator7.setBounds(0, 0, 10, 32);

        jSeparator8.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jPanel1.add(jSeparator8);
        jSeparator8.setBounds(380, 0, 20, 32);

        jLabel7.setText("Pris i €");
        jPanel1.add(jLabel7);
        jLabel7.setBounds(460, 10, 50, 14);

        add(jPanel1);
        jPanel1.setBounds(10, 10, 560, 30);
    }// </editor-fold>//GEN-END:initComponents

    private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
        updateLagerPanel();
        søgVareTxt.setText("");
    }//GEN-LAST:event_formComponentShown

    private void varegruppeComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_varegruppeComboItemStateChanged
        if (!settingVaregruppeCombo) {
            updateLagerPanel();
        }
    }//GEN-LAST:event_varegruppeComboItemStateChanged

    private void søgVareTxtKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_søgVareTxtKeyReleased
        søgVareFraSøgefelt();
    }//GEN-LAST:event_søgVareTxtKeyReleased

    private void søgVareTxtFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_søgVareTxtFocusGained
        varegruppeCombo.setSelectedIndex(0);
    }//GEN-LAST:event_søgVareTxtFocusGained


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel TotalAntalLabel;
    private javax.swing.JTextField TotalAntalPåLagerTxt;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JSeparator jSeparator5;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JSeparator jSeparator7;
    private javax.swing.JSeparator jSeparator8;
    private javax.swing.JPanel lagerListePanel;
    private javax.swing.JLabel søgVareLabel;
    private javax.swing.JTextField søgVareTxt;
    private javax.swing.JComboBox varegruppeCombo;
    private javax.swing.JLabel varegruppeLabel;
    // End of variables declaration//GEN-END:variables
}
